﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BLL;
using Exceptions;

namespace WCF
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "WCFAgencia" in code, svc and config file together.
    public class WCFAgencia : IWCFAgencia
    {
        public List<DTO.Agencia> list()
        {
            BLLAgencia bllAgencias = new BLLAgencia();
            List<BTO.Agencia> btoAgencias = bllAgencias.list();
            List<DTO.Agencia> dtoAgencias = new List<DTO.Agencia>();
            DTO.Agencia dtoAgencia;

            foreach (BTO.Agencia btoAgencia in btoAgencias)
            {
                dtoAgencia = new DTO.Agencia();
                dtoAgencia.IDAgencia = btoAgencia.IDAgencia;
                dtoAgencia.codAgencia = btoAgencia.codAgencia;
                dtoAgencia.nome = btoAgencia.nome;
                dtoAgencia.morada = btoAgencia.morada;
                dtoAgencia.codPostal = btoAgencia.codPostal;
                dtoAgencia.localidade = btoAgencia.localidade;
                dtoAgencia.telefone = btoAgencia.telefone;
                dtoAgencia.email = btoAgencia.email;
                dtoAgencia.responsavel = btoAgencia.responsavel;

                dtoAgencias.Add(dtoAgencia);
            }

            return dtoAgencias;
        }

        public DTO.Agencia getByID(int id)
        {
            BLLAgencia bllAgencia = new BLLAgencia();
            DTO.Agencia dtoAgencia = new DTO.Agencia();

            try
            {
                BTO.Agencia btoAgencia = bllAgencia.getByID(id);
                
                dtoAgencia.IDAgencia = btoAgencia.IDAgencia;
                dtoAgencia.codAgencia = btoAgencia.codAgencia;
                dtoAgencia.nome = btoAgencia.nome;
                dtoAgencia.morada = btoAgencia.morada;
                dtoAgencia.codPostal = btoAgencia.codPostal;
                dtoAgencia.localidade = btoAgencia.localidade;
                dtoAgencia.telefone = btoAgencia.telefone;
                dtoAgencia.email = btoAgencia.email;
                dtoAgencia.responsavel = btoAgencia.responsavel;
                
            }
            catch (NotFoundAgenciaException e)
            {
                throw new NotFoundAgenciaException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Agencia não encontrada!");
            }

            return dtoAgencia;

        }

        public DTO.Agencia getByName(String nome)
        {
            BLLAgencia bllAgencia = new BLLAgencia();
            DTO.Agencia dtoAgencia = new DTO.Agencia();

            try
            {
                BTO.Agencia btoAgencia = bllAgencia.getByName(nome);

                dtoAgencia.IDAgencia = btoAgencia.IDAgencia;
                dtoAgencia.codAgencia = btoAgencia.codAgencia;
                dtoAgencia.nome = btoAgencia.nome;
                dtoAgencia.morada = btoAgencia.morada;
                dtoAgencia.codPostal = btoAgencia.codPostal;
                dtoAgencia.localidade = btoAgencia.localidade;
                dtoAgencia.telefone = btoAgencia.telefone;
                dtoAgencia.email = btoAgencia.email;
                dtoAgencia.responsavel = btoAgencia.responsavel;
            }
            catch (NotFoundAgenciaException e)
            {
                throw new NotFoundAgenciaException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Agencia não encontrada!");
            }

            return dtoAgencia;
        }

        public DTO.Agencia getByCodAgencia(String codAgencia)
        {
            BLLAgencia bllAgencia = new BLLAgencia();
            DTO.Agencia dtoAgencia = new DTO.Agencia();

            try
            {
                BTO.Agencia btoAgencia = bllAgencia.getByCodAgencia(codAgencia);
               
                dtoAgencia.IDAgencia = btoAgencia.IDAgencia;
                dtoAgencia.codAgencia = btoAgencia.codAgencia;
                dtoAgencia.nome = btoAgencia.nome;
                dtoAgencia.morada = btoAgencia.morada;
                dtoAgencia.codPostal = btoAgencia.codPostal;
                dtoAgencia.localidade = btoAgencia.localidade;
                dtoAgencia.telefone = btoAgencia.telefone;
                dtoAgencia.email = btoAgencia.email;
                dtoAgencia.responsavel = btoAgencia.responsavel;
                
            }
            catch (NotFoundAgenciaException e)
            {
                throw new NotFoundAgenciaException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Agencia não encontrada!");
            }
            return dtoAgencia;
        }

        public void update(DTO.Agencia toUpdate)
        {
            BLLAgencia bllAgencia = new BLLAgencia();
            BTO.Agencia btoAgencia = new BTO.Agencia();

            btoAgencia.IDAgencia = toUpdate.IDAgencia;
            btoAgencia.codAgencia = toUpdate.codAgencia;
            btoAgencia.nome = toUpdate.nome;
            btoAgencia.morada = toUpdate.morada;
            btoAgencia.codPostal = toUpdate.codPostal;
            btoAgencia.localidade = toUpdate.localidade;
            btoAgencia.telefone = toUpdate.telefone;
            btoAgencia.email = toUpdate.email;
            btoAgencia.responsavel = toUpdate.responsavel;

            try
            {
                bllAgencia.update(btoAgencia);
            }
            catch (InsertDadosAgenciaException e)
            {
                throw new InsertDadosAgenciaException(e.Message);
            }
            catch (CodAgenciaException e)
            {
                throw new CodAgenciaException(e.Message);
            }
            catch (NomeAgenciaException e)
            {
                throw new NomeAgenciaException(e.Message);
            }
            catch (Exception e)
            {
                throw new UpdateAgenciaException(e.Message);
            }
        }

    }
}
